賀!此系列文榮獲 2023 iThome 鐵人賽《優選》獎項,正在規劃出書中,感謝大家的支持🙏,同名課程「Java 工程師必備!Spring Boot 零基礎入門」也已在 Hahow 平台上架
哈囉大家好,我是古古
上一篇文章有介紹 Http method 中,GET 和 POST 是怎麼用不同的方式傳遞參數給後端的,讓大家先對參數的傳遞有一個認識
那麼接著這篇文章,就會回到 Spring Boot 上,介紹要如何在 Spring Boot 中,去接住前端所傳過來的這些參數的值,也因為這邊有比較多種方式可以接住前端的值,因此會分成上、下兩篇來介紹,那所以我們就開始吧!
在上一篇文章中有介紹到,GET 是明信片的概念,所以 「前端只能夠將參數放在 url 的最後面,透過這個格式將參數傳遞給後端」,而這些放在 url 最後面的參數,我們會稱為是 query parameter
也因為 GET 是將參數 (query parameter) 放在 url 的最後面,又因為 url 是公開可見的,所以「當你使用 GET 方法時,你所傳遞的參數就會被別人所看見」,因此才說 GET 是明信片的概念(也就是內容都會被別人看光光)
而不同於 GET 請求,POST 則是信封的概念,因此 「前端則會將參數放在 request body 中做傳遞」,並且通常是使用 Json 格式來傳遞
也因為 request body 中的值會被封裝起來,因此參數不會洩漏,因此才說 POST 是信封的概念(也就是內容不會被其他人看到
而了解了 GET 和 POST 傳遞參數的不同方式之後,我們就可以實際的到 Spring Boot 中,來看一下要如何在 Spring Boot 中,去接住這些前端傳過來的參數
在 Spring Boot 中,有四個註解可以去接住前端的參數,分別是:
這四個註解雖然長得滿像的(都是以 @Request 開頭),但是他們功能是完全不同的,所以接下來就會分成兩篇文章,分別來介紹這四個註解要如何使用
首先先介紹第一個 @ReqeustParam
,他的用途,就是去 「接住那些放在 url 後面的參數」
像是上面的 GET 方法在傳遞參數時,就是把參數放在 url 的最後面來傳遞,因此當前端使用 GET 方法來發起一個 Http request 時,Spring Boot 這邊就是會使用 @RequestParam
,來將前端所傳遞過來的參數給接住
舉例來說,假設我們今天使用了 GET 請求,並且在 url 的最後面,加上一個 id=123
的參數的話,那麼實際的 url 就會長得像是這個樣子
http://localhost:8080/test1?id=123
那麼當前端透過這個格式,傳遞 id=123
的參數的值來的話,在 Spring Boot 這邊,就只需要在 test1() 方法中,去新增一個 Integer 類型的參數 id,並且在這個參數的前面,去加上一個 @RequestParam
這樣到時候,id 的值就會是 123,因此我們就成功的取得到前端傳遞過來的參數的值了!
在使用 @RequestParam
去接住 url 後面的參數時,首先有一個重點需要注意,就是在 Spring Boot 中的變數的「名字」,必須要和 url 中的參數的「名字」一樣才可以
換句話說,假設 url 中添加的是 id=123
,那麼在 Spring Boot 中的參數的名字,也必須是 id,但如果 url 中添加的是 name=Judy
,那麼在 Spring Boot 中的參數的名字,就必須是 name
假設參數名字不一致的話,@RequestParam
是沒有辦法成功取得到 url 中的參數的,因此這部分需要特別注意!
補充:其實 @RequestParam 也是有支援一些設定,讓「url 中的參數名字」和「Spring Boot 中的參數名字」可以不同的,但如果沒有特別設定的話,Spring Boot 是會找不到的該參數的值的
因此大家在一開始學習時,就建議盡量讓參數名字一致,比較不會出現問題!
使用 @RequestParam
去接住 url 參數的第二個重點,就是「參數的類型需要一致」
譬如說在 url 中所添加的是 id=123
,那就是在暗示這個 id 參數的值是一個整數,因此在 Spring Boot 中就需要將該參數宣告為 Integer id
或是 int id
但如果 url 中所添加的是 name=Judy
,那就是在暗示這個 name 參數的值是一個字串,因此在 Spring Boot 中需要將該參數宣告為 String name
只有當類型一致時,Spring Boot 才有辦法順利將該參數的值給轉換過來,否則的話 Spring Boot 是會報錯的!
所以只要好好運用 @RequestParam
這個註解,我們就可以去取得前端放在 url 後面的那些參數了!
了解如何取得 url 後面的參數之後,接著我們可以來看一下,要怎麼透過 @RequestBody
,來取得前端放在 request body 中的參數
@RequestBody
的用途,就是去 「接住放在 request body 中的參數」,像是上面的 POST 方法在傳遞參數時,就是把參數放在 request body 中來傳遞
因此如果我們想要去接住這些放在 request body 中的參數的話,那麼就是要使用 @RequestBody
才能接住!
舉例來說,假設前端在 request body 中,傳遞了下圖中 Json 格式的參數過來的話
那麼我們首先要做的,就是去創建一個和這個 Json 格式「一一對應」的 Java class 出來
譬如說我們可以先去 new 一個新的 Student class 出來,並且在該 Student class 中添加下列的程式
public class Student {
private Integer id;
private String name;
// getter 和 setter
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
當我們這樣寫之後,就等於是創建了一個「和 Json 格式一一對應的 Java class」出來了!
大家觀察一下可以發現,在 Json 格式中有兩個 key,分別是 id 和 name,其中 id 的值是「整數」的 123,而 name 的值是「字串」的 Judy
而在 Student class 裡面,也有兩個變數,分別是 id 和 name,並且 id 的類型「也是整數」,而 name 的類型「也是 String」
因此只要我們去創建了一個和 Json 格式一一對應的 Java class 出來,那麼 Spring Boot 到時候,就可以去將 request body 中的 Json 格式,給轉回來成這個 Student class,並且將 id 和 name 的 value 的值,存放在 Student 中的 id 和 name 的變數裡了!
而了解這個「Json 格式和 Java class 的轉換邏輯」之後,最後就只要像 @RequestParam
的用法一樣,在 test2() 方法中,去新增一個 Student 類型的參數 student,並且在這個參數的前面,去加上一個 @RequestBody
這樣到時候,Spring Boot 就會將 request body 中的 Json 格式,給轉換成是我們自定義的 Student class,因此我們就也能成功的取得到前端傳遞過來的參數的值了!
在使用 @RequestBody
去接住前端放在 request body 中的參數時,最需要特別注意的就是「和 Json 格式一一對應的 Java class」要小心不要寫錯,只要注意好這一點,基本上就沒有特別需要小心的部分了~
這篇文章先簡單列出了 Spring Boot 中提供的四種取得前端參數的註解,並且接著詳細介紹了其中的兩個註解:@ReqestParam
和 @RequestBody
,介紹要如何透過這兩個註解,分別去取得前端放在 url 最後面的參數、以及取得前端放在 request body 中的參數
那麼下一篇文章,我們就會來介紹另外兩個取得前端參數的註解:@RequestHeader
以及 @PathVariable
,那我們就下一篇文章見啦!